﻿using System;
using System.Data.Entity;
using System.Linq;
using System.Linq.Expressions;
using VietTrips.Domain.Contexts;
using VietTrips.Domain.Interfaces;
using VietTrips.Domain.Models;

namespace VietTrips.Domain.Repositories
{
    public class ActivityRepository : IActivityRepository
    {
        // Context cho các bảng Activity, ActivityDetails, Activity Types
        readonly ActivityContexts _context = new ActivityContexts();

        // Lấy ra list Activity
        //
        public IQueryable<Activity> All
        {
            get { return _context.Activities; }
        }

        //
        //
        public IQueryable<Activity> AllIncluding(params Expression<Func<Activity, object>>[] includeProperties)
        {
            return includeProperties.Aggregate<Expression<Func<Activity, object>>, 
                IQueryable<Activity>>(_context.Activities, (current, includeProperty) => current.Include(includeProperty));
        }

        // Tìm Activity theo ID
        //
        public Activity Find(int id)
        {
            return _context.Activities.Find(id);
        }

        // Thêm một Activity mới
        //
        public void Insert(Activity activity)
        {
            _context.Activities.Add(activity);
            this.Save();
        }

        // Cập nhất 1 Activity có sẵn
        //
        public void Update(Activity activity)
        {
            _context.Entry(activity).State = EntityState.Modified;
            this.Save();
        }

        // Xoá một Activity
        //
        public void Delete(int id)
        {
            var activity = _context.Activities.Find(id);
            activity.IsDeleted = true;
            activity.LastModified = DateTime.Now;
            this.Update(activity);
        }

        // Lưu lại các thay đổi
        //
        public void Save()
        {
            _context.SaveChanges();
        }

        //
        //
        public void Dispose()
        {
            _context.Dispose();
        }

        // Tạo hoặc update Thể loại Activity
        //
        public int CreateUpdateActivityType(ActivityType activityType)
        {
            if (activityType.ActivityTypeId == default(int))
            {
                activityType = _context.ActivityTypes.Add(activityType);
            }
            else
            {
                _context.Entry(activityType).State = EntityState.Modified;
            }
            this.Save();
            return activityType.ActivityTypeId;
        }

        // Xoá một Thể loại Activity
        //
        public void DeleteActivityType(int id)
        {
            var activityType = _context.ActivityTypes.Find(id);
            activityType.IsDeleted = true;
            activityType.LastModified = DateTime.UtcNow;
            _context.Entry(activityType).State = EntityState.Modified;
            this.Save();
        }

        // Get tất cả Activity Types
        //
        public IQueryable<ActivityType> AllTypes
        {
            get { return _context.ActivityTypes.Where(at => !at.IsDeleted); }
        }
    }
}
